package com.tool.cn.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Scanner;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * gz工具
 * 
 * @author wangzh 2017年10月17日 下午3:54:19
 */
public class GzUtil {
	
	private static Logger log= LoggerFactory.getLogger(GzUtil.class);
	
	
	/**
	 * 压缩gz文件
	 * @param sourceFile 物理路径源文件
	 * @param gzipFileName 输出gz文件
	 * @return
	 */
	public static boolean linuxGzipFile(String sourceFile, String gzipFileName ) {
		return linuxGzipFile(sourceFile, gzipFileName, false);
	}
	
	/**
	 * 压缩gz文件
	 * @param sourceFile 物理路径源文件
	 * @param gzipFileName 输出gz文件
	 * @param delete 删除原文件
	 * @return
	 */
	public static boolean linuxGzipFile(String sourceFile, String gzipFileName,boolean delete ) {
		
		if(System.getProperty("os.name").indexOf("Windows")>=0){  
			try(
					// 创建zip输出流
					GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(gzipFileName),1024);
					// 建立gzip压缩文件输入流
					BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(sourceFile)),1024);
					) {


				int tag;
				// 将源文件写入到zip文件中
				while ((tag = input.read()) != -1) {
					out.write(tag);
				}
				
				out.flush();
			} catch (Exception e) {
				log.error("Gzip File :"+sourceFile+" Error",e);
				return false;
			}
			
		}else {   //linux 调用系统命令速度更快
			
			int state=ShellUtil.getInstance().submitSH("gzip -c "+sourceFile+" > "+gzipFileName);
			if(state!=0) {
				return false;
			}
		}
		
		if(delete) {
			new File(sourceFile).delete();
		}
		return true;
	}
	
	/**
	 * 解压gz文件
	 * @param sourceGzFile 压缩文件
	 * @param outputFile 输出文件
	 * @return
	 */
	public static boolean linuxUngzipFile(String sourceGzFile,String outputFile) {
		
		if(System.getProperty("os.name").indexOf("Windows")>=0){  
	       try(
		           //建立gzip解压工作流
		    	   GZIPInputStream input = new GZIPInputStream(new FileInputStream(sourceGzFile));
		           //建立解压文件输出流
		    	   FileOutputStream output= new FileOutputStream(outputFile);
	    		   ) {

	           byte[] buf=new byte[1024];
	           int len;
	           
	           while ((len = input.read(buf)) >0) {
	               output.write(buf,0,len);
	           }

	          output.flush();
	       } catch (Exception e){
	           log.error("Gunzip File :"+sourceGzFile+" Error",e);
	           return false;
	       }
	       
		}else {
			int state=ShellUtil.getInstance().submitSH("gunzip -c "+sourceGzFile+" > "+outputFile);
			if(state!=0) {
				return false;
			}
		}

       return true;
	}

	/**
	 * 直接读取gz文件内容写入gz文件
	 * @param sourceFile
	 * @return
	 */
	public static boolean readGzWriteGz(String sourceFile) {
			String outputFile=sourceFile.replace(".txt", "-output.txt");
			log.info("输出文件名:"+outputFile);
			try(
					//读取gz
					InputStream in = new GZIPInputStream(new FileInputStream(sourceFile));
			        Scanner sc=new Scanner(in);
					
					//写入gz
					GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(outputFile));
					){

				String context;
				while(sc.hasNextLine()){
						context=sc.nextLine()+"\n";
			            System.out.println(context);
			            out.write(context.getBytes());
			        }
		
			}catch(Exception e) {
				log.error("Deal Gz File:"+sourceFile+" Error ",e);
				return false;
			}
			return true;
	}
}
